﻿function CGcanvas(id) {
    this.cg_show_state = false;
    //
    var cg_context = null;
    var cg = { w: 640, h: 480 };
    var prevImg = null;
    var animate_fun = null;
    var arg = null;
    var animate_fun_name = "CGfun_Gradient";
    var draw_end_callback = null;
    var _this = this;
    var cg_canvas = document.getElementById(id);
    //
    //----------------------------------------------
    //          Constructors
    //----------------------------------------------
    cg_context = cg_canvas.getContext("2d");
    //----------------------------------------------
    //          public
    //----------------------------------------------
    this.SetCallBack = function (callback) {
        draw_end_callback = callback;
    }
    this.SetArg = function (parameters) {
        if (parameters) {
            arg = arg || new Object();
            for (var i in parameters) {
                arg[i] = parameters[i];
            }
        }
    }
    this.NewAnimateFun = function (funname) {
        animate_fun_name = funname || animate_fun_name;
        try {
            eval("animate_fun=new " + animate_fun_name + "(cg_context,callback,cg)");
        }
        catch (ex) {
            alert("调用自定义CG动画函数出错:" + animate_fun_name);
        }
    }
    this.DrawCG = function (img) {
        this.cg_show_state = true;
        if (!prevImg) {
            prevImg = img;
            animate_fun.Show(img, arg);
        }
        else {
            arg.prevImg = prevImg;
            prevImg = null;
            animate_fun.Hide(img, arg);
        }
    }
    this.ClearCG = function () {
        if (prevImg) {
            this.cg_show_state = true;
            arg.prevImg = prevImg;
            animate_fun.Hide(null, arg);
        }
    }
    //----------------------------------------------
    //          private
    //----------------------------------------------
    function callback(img, fun, arg) {
        if (prevImg) {
            prevImg = img;
            _this.cg_show_state = false;
            draw_end_callback();
            draw_end_callback = null;
        }
        else {
            prevImg = img;
            fun.Show(img, arg);
        }
    }
}
function CGfun_Gradient(cg_context, callback, cg) {
    var _cg_context = cg_context;
    var _callback = callback;
    var _cg = cg;
    var _cgInterval = null;
    var _span = 0.03;
    var _this = this;
    this.Show = function (img, arg) {
        var _arg = arg;
        var _img = img;
        _cg_context.save();
        _cg_context.globalAlpha = 0.0;
        _cgInterval = window.setInterval(function () {
            if (_cg_context.globalAlpha + _span >= 1)
                _cg_context.globalAlpha = 1;
            else
                _cg_context.globalAlpha += _span;
            _cg_context.clearRect(0, 0, _cg.w, _cg.h);
            _cg_context.drawImage(img, 0, 0);
            if (_cg_context.globalAlpha == 1) {
                window.clearInterval(_cgInterval);
                _cg_context.restore();
                _callback(_img, _this, _arg);
            }
        }, (arg && arg.TimeSpan) || config.cgAnimateTimeSpeed);
    }
    this.Hide = function (img, arg) {
        var _arg = arg;
        var _img = img;
        _cg_context.save();
        _cg_context.globalAlpha = 1;
        _cgInterval = window.setInterval(function () {
            if (_cg_context.globalAlpha - _span <= 0)
                _cg_context.globalAlpha = 0;
            else
                _cg_context.globalAlpha -= _span;
            _cg_context.clearRect(0, 0, _cg.w, _cg.h);
            _cg_context.drawImage(_arg.prevImg, 0, 0);
            if (_cg_context.globalAlpha == 0) {
                window.clearInterval(_cgInterval);
                _cg_context.restore();
                _callback(_img, _this, _arg);
            }
        }, (arg && arg.TimeSpan) || config.cgAnimateTimeSpeed);
    }
}
//function CGfun(cg_context, callback, cg) {
//    var _cg_context = cg_context;
//    var _callback = callback;
//    var _cg = cg;
//    var _cgInterval = null;
//    var _span = 10;
//    var _this = this;
//    //
//    this.Show = function (img, arg) {
//        _cg_context.drawImage(img, 0, 0);
//        var _input = _cg_context.getImageData(0, 0, _cg.w, _cg.h);
//        _cg_context.clearRect(0, 0, _cg.w, _cg.h);
//        var _a = 0;
//        var _arg = arg;
//        var _img = img;
//        //
//        _cgInterval = window.setInterval(function () {
//            for (var y = 0; y < _cg.h; y++) {
//                for (var x = 0; x < _cg.w; x++) {
//                    _input.data[(y * _cg.w + x) * 4 + 3] = _a;
//                }
//            }
//            _cg_context.putImageData(_input, 0, 0);
//            if (_a == 255) {
//                window.clearInterval(_cgInterval);
//                _callback(_img, _this, _arg);
//            }
//            else {
//                _a = Math.min(255, _a + _span);
//            }
//        }, arg && arg.timespan || config.cgAnimateTimeSpeed);
//    }
//    this.Hide = function (img, arg) {
//        var _input = _cg_context.getImageData(0, 0, _cg.w, _cg.h);
//        var _a = 255;
//        var _arg = arg;
//        var _img = img;
//        //
//        _cgInterval = window.setInterval(function () {
//            for (var y = 0; y < _cg.h; y++) {
//                for (var x = 0; x < _cg.w; x++) {
//                    _input.data[(y * _cg.w + x) * 4 + 3] = _a;
//                }
//            }
//            _cg_context.putImageData(_input, 0, 0);
//            if (_a == 0) {
//                window.clearInterval(_cgInterval);
//                _callback(_img, _this, _arg);
//            }
//            else {
//                _a = Math.max(0, _a - _span);
//            }
//        }, arg && arg.timespan || config.cgAnimateTimeSpeed);
//    }
//}